﻿package com.msjt.base;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


/**
 * hibernate在spring下通用的数据操作
 * 
 * @author kw
 * 
 */
public class BaseDAO extends HibernateDaoSupport {
	private String poName = "";

	public void setPoName(String poName) {
		this.poName = poName;
	}

	/**
	 * 修改或保存对象
	 * 
	 * @param obj
	 */
	public boolean saveOrUpdate(BasePO obj) {
		boolean flag=true;
		try {
			this.getHibernateTemplate().saveOrUpdate(obj);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			flag=false;
		}
		return flag;
		
	}

	/**
	 * 保存对象
	 * 
	 * @param obj
	 */
	public boolean save(BasePO obj) {
		boolean flag=true;
		
		try {
			 
			this.getHibernateTemplate().save(obj);
			
		} catch (Exception e) {
			e.printStackTrace();
			flag=false;
		}
		return flag;
	}

	/**
	 * 删除对象
	 * 
	 * @param obj
	 */
	public boolean delete(BasePO obj) {
		if (obj==null) {
			return false;
		}
		boolean flag=true;
		try {
			this.getHibernateTemplate().delete(obj);
		} catch (Exception e) {
			e.printStackTrace();
			flag=false;
		}
		return flag;
	}

	/**
	 * 根据Id删除对象
	 * 
	 * @param id
	 */
	public boolean deleteById(Serializable id) {
		BasePO obj = findById(id);
		if (obj != null) {
			return this.delete(obj);
		}else{
			return false;
		}
	}
	
	/**
	 * 根据ID查询对象
	 * 
	 * @param id
	 * @return
	 */
	public BasePO findById(Serializable id) {
		Object obj = this.getHibernateTemplate().get(poName, id);
		return (BasePO) obj;
	}
	/**
	 * 查询对象的全部数据
	 * 
	 * @return List集合
	 */
	
	@SuppressWarnings("rawtypes")
	public List getAll() {
		String hql = "from " + this.poName;
		return searchByHQL(hql, null);
	}

	/**
	 * 根据HQL语句查询，可有条件
	 * 
	 * @param hql
	 * @param params
	 * @return
	 */
	
	public List<?> searchByHQL(String hql, Object[] params) {
		List<?> list = null;
		list=getHibernateTemplate().find(hql, params);
	    //使用此种方式获取session在commit或rallback后会自动关闭，需要在配置文件中配置
		//this.getHibernateTemplate().getSessionFactory().getCurrentSession();
		//Query query = this.getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(hql);
		//使用getSession()方法获取
//		Query query = this.getSession().createQuery(hql);
//		if (params != null) {
//			for (int i = 0; i < params.length; i++) {
//				query.setParameter(i, params[i]);
//			}
//		}
//		list = query.list();
		return list;
	}

	/**
	 * 根据多条件执行hql更新(修改或删除)
	 * 
	 * @param queryString
	 * @param parameters
	 * @return
	 */
	public Boolean updateByHql(final String queryString, final Object[] parameters) {
		return (Boolean)getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session) {
						Query query = session.createQuery(queryString);
						if (parameters != null) {
							for (int i = 0; i < parameters.length; i++) {
								query.setParameter(i, parameters[i]);
							}
						}
						if( query.executeUpdate()>0){
							return true;
						}else{
							return false;
						}
					}
				});
	}
//	public Boolean updateBySql(final String sql, final Object[] parameters) {
//		return (Boolean)getHibernateTemplate().execute(
//				new HibernateCallback() {
//					public Object doInHibernate(Session session) {
//						Query query = session.createSQLQuery(sql);
//						if (parameters != null) {
//							for (int i = 0; i < parameters.length; i++) {
//								query.setParameter(i, parameters[i]);
//							}
//						}
//						if( query.executeUpdate()>0){
//							return true;
//						}else{
//							return false;
//						}
//					}
//				});
//	}
	
	/**
	 * 获取单行单列的记录总数(针对聚合函数count,avg等)
	 * 
	 * @param hql
	 * @return
	 */
	public Integer getTotalCount(String hql,Object [] params) {
		List<?> lst = this.getHibernateTemplate().find(hql,params);
		if (lst.size() > 0) {
			Number num = (Number) lst.get(0);
			return num.intValue();
		}
		return 0;

	}
	 /**
	    * 分页查询
	    * @param hql
	    * @param currentPage
	    * @param pageSize
	    * @return
	    */
		public List<?> searchByPage(final String hql, final Object [] params,final int currentPage,
				final int pageSize) {
			List<?> list = getHibernateTemplate().executeFind(
					new HibernateCallback() {
						public Object doInHibernate(Session session)throws HibernateException, SQLException {
							Query query = session.createQuery(hql);
							if(params!=null){
								for (int i = 0; i < params.length; i++) {
									query.setParameter(i, params[i]);
								}
								
							}
							query.setFirstResult((currentPage - 1) * pageSize);
							query.setMaxResults(pageSize);
							List<?> list = query.list();
							return list;
						}
					});
			return list;
		}
}
